#ifndef TOOL_H
#define TOOL_H

#include <QCoreApplication>
#include <QString>
#include <QVariant>
#include <QSettings>
#include <QFile>

#include <QJsonDocument>
#include <QJsonParseError>
#include <QJsonObject>
#include <QJsonArray>
#include <QByteArray>

#include <QDebug>
namespace TOOL {
/**
 * @brief The INI class ini文件操作类
 */
class INI
{
public:
    INI(QString ini_file);
    QVariant Get(QString section,QString key);
    void Set(QString section,QString key,QVariant value);
private:
    QSettings m_setIni;
    QString m_strFilePath;
};
/**
 * @brief The FILE class 普通文件操作类
 */
class FILE
{
public:
	FILE(QString file_path);
    bool FileExists(QString file_name);
private:
    QString m_strFilePath;
    QFile m_file;
};
/**
 * @brief The JSON class Json文件操作类
 */
class JSON
{
public:
    JSON(QByteArray byteArray);
    template<class T, class ...Args>
    T Get(Args... args){
        QJsonObject temp_root = root;
        // 解参数包
        QStringList lst_json = { args... };
        for(auto it = lst_json.begin(); it != lst_json.end(); ++ it){
            if(temp_root[*it].isObject()){
                temp_root = temp_root[*it].toObject();
                continue;
            }
            if constexpr(std::is_same_v<T, bool>) {
                return temp_root[*it].toBool();
            } else if constexpr (std::is_integral_v<T> || std::is_floating_point_v<T>) {
                return temp_root[*it].toDouble();
            } else if constexpr (std::is_same_v<T, QString>) {
                return temp_root[*it].toString();
            } else if constexpr (std::is_same_v<T, std::string>) {
                return temp_root[*it].toString().toStdString();
            } else if constexpr (std::is_same_v<T, QJsonObject>) {
                return temp_root[*it].toObject();
            } else if constexpr (std::is_same_v<T, QJsonArray>) {
                return temp_root[*it].toArray();
            } else { // if constexpr (std::is_same_v<T, QJsonValue>) {
                return temp_root[*it];
            }
        }
    }

    bool IsEmpty(){return root.isEmpty();}

private:
    QJsonObject load(const QByteArray &byteArray);

private:
    QJsonObject root;
};
}


#endif // TOOL_H
